#lang scribble/doc

@(require (for-label racket)
          scribble/manual
          "../../util/common.rkt")

@title[#:tag "begin-why"]{为什么是Racket}

@margin-note{Lisp/scheme的链接指向wikipedia，可能需要翻墙。建议读者在阅读本书的时候自行进入翻墙模式，以便减少不必要的麻烦}

想一句话说清楚什么是Racket很困难。Racket是 @rh["http://zh.wikipedia.org/wiki/Scheme" "Scheme"] 的一种方言，而Scheme又是 @rh["http://zh.wikipedia.org/zh-cn/LISP" "Lisp"] 的一种方言。作为一门古老的计算机语言，Lisp一直被许多人视为史上最非凡的编程语言。50多年前诞生的时候，它就带来了诸多革命性的创新，并且极大地影响了后来编程语言的发展，即使在一大批现代语言不断涌现的今天，Lisp的诸多特性仍然未被超越。Paul Graham在他的 @rh["http://book.douban.com/subject/6021440/" "「黑客与画家」"] 中写到Lisp诞生时，就包含了9种思想，而这九种思想至今在其它语言中还只实现了一部分：

@margin-note{本段内容引用自阮一峰的博文：@rh["http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html" "为什么Lisp语言如此先进？（译文）"]}

@verbatim[#:indent 4]{
1. 条件结构（即"if-then-else"结构）。现在大家都觉得这是理所当然的，但是Fortran I就没有这个结构，它只有基于底层机器指令的goto结构。

2. 函数也是一种数据类型。在Lisp语言中，函数与整数或字符串一样，也属于数据类型的一种。它有自己的字面表示形式（literal representation），能够储存在变量中，也能当作参数传递。一种数据类型应该有的功能，它都有。

3. 递归。Lisp是第一种支持递归函数的高级语言。

4. 变量的动态类型。在Lisp语言中，所有变量实际上都是指针，所指向的值有类型之分，而变量本身没有。复制变量就相当于复制指针，而不是复制它们指向的数据。

5. 垃圾回收机制。

6. 程序由表达式（expression）组成。Lisp程序是一些表达式区块的集合，每个表达式都返回一个值。这与Fortran和大多数后来的语言都截然不同，它们的程序由表达式和语句（statement）组成。
区分表达式和语句，在Fortran I中是很自然的，因为它不支持语句嵌套。所以，如果你需要用数学式子计算一个值，那就只有用表达式返回这个值，没有其他语法结构可用，因为否则就无法处理这个值。
后来，新的编程语言支持区块结构（block），这种限制当然也就不存在了。但是为时已晚，表达式和语句的区分已经根深蒂固。它从Fortran扩散到Algol语言，接着又扩散到它们两者的后继语言。

7. 符号（symbol）类型。符号实际上是一种指针，指向储存在哈希表中的字符串。所以，比较两个符号是否相等，只要看它们的指针是否一样就行了，不用逐个字符地比较。

8. 代码使用符号和常量组成的树形表示法（notation）。

9. 无论什么时候，整个语言都是可用的。Lisp并不真正区分读取期、编译期和运行期。你可以在读取期编译或运行代码；也可以在编译期读取或运行代码；还可以在运行期读取或者编译代码。
}

目前，整个Lisp社区被主流软件公司接受的程度还很低，而Lisp中最受人瞩目的当属Clojure和Racket。作为Lisp的一种方言，Racket包含了几乎所有Lisp的优点，同时也提供了大量有用的库，降低初学者学习的成本 —— 值得一提的是，Racket在很多高校中都作为程序语言的入门语言用于教学。

说点关于我学这门语言前的状态：

@itemlist[
@item{两三年前我接触过Clojure，浅尝辄止，兴趣没维持超过一周，各种example的代码量不超过500行，各种宏根本看不懂。}
@item{略懂emacs，强迫自己在sublime和pycharm之外只能使用emacs，能简单修改其配置（基于Emacslisp）。}
@item{对无穷无尽嵌套的括号没有太大反感，语法对我来说不是个事（如果在这个世界上你能忍受javascript/node.js，那么没什么语法你不能忍受的）。}
@item{最熟悉的语言是Python和C，从未用过任何一门函数式编程语言写过一个有意义的项目。}
]

所以，从写这本书起我和你基本上是在同步学习，让我们一起努力，共同成长，进入Racket的奇妙世界吧！